blob: 311f5cbd38029ddd29ec9eaf2cea30e75461fee1 [file] [log] [blame]
Avi Drissman3e1a26c2022-09-15 20:26:031// Copyright 2016 The Chromium Authors
sky138f54d2016-07-26 13:33:082// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/base/accelerators/accelerator.h"
6
Jan Wilken Dörriead587c32021-03-11 14:09:277#include <string>
8
Elly Fong-Jonesf795ec62018-03-30 22:26:069#include "base/strings/utf_string_conversions.h"
10#include "build/build_config.h"
sky138f54d2016-07-26 13:33:0811#include "testing/gtest/include/gtest/gtest.h"
wutaoea403cb72018-03-09 18:26:2412#include "ui/events/event.h"
Danny Wang26d782c2023-07-25 19:01:1813#include "ui/events/types/event_type.h"
sky138f54d2016-07-26 13:33:0814
15namespace ui {
16
17TEST(AcceleratorTest, Repeat) {
18 const Accelerator accelerator_a(VKEY_A, EF_NONE);
19 EXPECT_FALSE(accelerator_a.IsRepeat());
20
21 const Accelerator accelerator_b(VKEY_B, EF_IS_REPEAT);
22 EXPECT_TRUE(accelerator_b.IsRepeat());
23
24 const Accelerator accelerator_b_copy(accelerator_b);
25 EXPECT_TRUE(accelerator_b_copy.IsRepeat());
26}
27
wutaoea403cb72018-03-09 18:26:2428TEST(AcceleratorTest, TimeStamp) {
29 const Accelerator accelerator_a(VKEY_A, EF_NONE);
30 EXPECT_EQ(base::TimeTicks(), accelerator_a.time_stamp());
31
Peter Kastinge5a38ed2021-10-02 03:06:3532 const base::TimeTicks event_time = base::TimeTicks() + base::Milliseconds(1);
Avi Drissmanae99ae282024-07-22 20:44:2833 KeyEvent keyevent(EventType::kKeyPressed, VKEY_SPACE, EF_NONE, event_time);
wutaoea403cb72018-03-09 18:26:2434
35 const Accelerator accelerator_b(keyevent);
36 EXPECT_EQ(event_time, accelerator_b.time_stamp());
37}
38
Xing Liudc65d4e2019-07-01 18:27:1039// Crash on Android builders. https://crbug.com/980267
Xiaohan Wang84074092022-01-20 21:25:5440#if BUILDFLAG(IS_ANDROID)
Xing Liudc65d4e2019-07-01 18:27:1041#define MAYBE_GetShortcutText DISABLED_GetShortcutText
42#else
43#define MAYBE_GetShortcutText GetShortcutText
44#endif
45TEST(AcceleratorTest, MAYBE_GetShortcutText) {
Elly Fong-Jonesf795ec62018-03-30 22:26:0646 struct {
47 KeyboardCode code;
48 int modifiers;
Avi Drissman5acfd1282021-04-01 01:56:1549 const char16_t* expected_long;
50 const char16_t* expected_short;
Elly Fong-Jonesf795ec62018-03-30 22:26:0651 } keys[] = {
deepak155680789bb2024-10-23 16:55:5552 {VKEY_Q, EF_CONTROL_DOWN | EF_SHIFT_DOWN, u"Ctrl+Shift+Q", u"⌃⇧Q"},
53 {VKEY_A, EF_ALT_DOWN | EF_SHIFT_DOWN, u"Alt+Shift+A", u"⌥⇧A"},
54 // Regression test for https://crbug.com/867732:
55 {VKEY_OEM_COMMA, EF_CONTROL_DOWN, u"Ctrl+Comma", u"⌃,"},
Xiaohan Wang84074092022-01-20 21:25:5456#if BUILDFLAG(IS_MAC)
deepak155680789bb2024-10-23 16:55:5557 {VKEY_T, EF_COMMAND_DOWN | EF_CONTROL_DOWN, nullptr, u"⌃⌘T"},
58#endif
59#if BUILDFLAG(IS_LINUX)
60 {VKEY_T, EF_COMMAND_DOWN | EF_CONTROL_DOWN, u"Super+Ctrl+T", nullptr},
Elly Fong-Jonesf795ec62018-03-30 22:26:0661#endif
62 };
63
64 for (const auto& key : keys) {
Jan Wilken Dörrie52639572021-03-11 16:49:5465 std::u16string text =
Elly Fong-Jonesf795ec62018-03-30 22:26:0666 Accelerator(key.code, key.modifiers).GetShortcutText();
Xiaohan Wang84074092022-01-20 21:25:5467#if BUILDFLAG(IS_MAC)
Avi Drissman5acfd1282021-04-01 01:56:1568 EXPECT_EQ(text, key.expected_short);
Elly Fong-Jonesf795ec62018-03-30 22:26:0669#else
Avi Drissman5acfd1282021-04-01 01:56:1570 EXPECT_EQ(text, key.expected_long);
Elly Fong-Jonesf795ec62018-03-30 22:26:0671#endif
72 }
73}
74
Anton Permyakov1ae73af2019-03-07 10:05:4375TEST(AcceleratorTest, ShortcutTextForUnknownKey) {
76 const Accelerator accelerator(VKEY_UNKNOWN, EF_NONE);
Jan Wilken Dörrie52639572021-03-11 16:49:5477 EXPECT_EQ(std::u16string(), accelerator.GetShortcutText());
Anton Permyakov1ae73af2019-03-07 10:05:4378}
79
Danny Wang26d782c2023-07-25 19:01:1880TEST(AcceleratorTest, VerifyToKeyEventConstructor) {
81 const Accelerator accelerator(VKEY_Z, EF_COMMAND_DOWN,
82 Accelerator::KeyState::RELEASED,
83 base::TimeTicks());
84 KeyEvent key_event = accelerator.ToKeyEvent();
85 // Check key event fields to verift if the right constructor is called.
86 EXPECT_EQ(key_event.key_code(), VKEY_Z);
Avi Drissmanae99ae282024-07-22 20:44:2887 EXPECT_EQ(key_event.Clone()->type(), ui::EventType::kKeyReleased);
Danny Wang26d782c2023-07-25 19:01:1888 EXPECT_FALSE(key_event.is_char());
89}
90
Zentaro Kavanagh29fd367f2021-05-07 23:38:0991TEST(AcceleratorTest, ConversionFromKeyEvent) {
Jayson Adams75533272021-10-20 20:50:2292 ui::KeyEvent key_event(
Avi Drissmanae99ae282024-07-22 20:44:2893 ui::EventType::kKeyPressed, ui::VKEY_F,
Jayson Adams75533272021-10-20 20:50:2294 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_FUNCTION_DOWN);
Zentaro Kavanagh29fd367f2021-05-07 23:38:0995 Accelerator accelerator(key_event);
96
97 EXPECT_EQ(accelerator.key_code(), ui::VKEY_F);
Jayson Adams75533272021-10-20 20:50:2298 EXPECT_EQ(accelerator.modifiers(),
99 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_FUNCTION_DOWN);
Zentaro Kavanagh29fd367f2021-05-07 23:38:09100}
101
Xiaohan Wang84074092022-01-20 21:25:54102#if BUILDFLAG(IS_MAC)
Jayson Adams7f27f552021-10-27 20:59:44103class AcceleratorTestMac : public testing::Test {
104 public:
105 AcceleratorTestMac() = default;
106 ~AcceleratorTestMac() override = default;
107
Anthony Cui9cc3dd92025-04-23 18:30:54108 // Returns a "short" vector representation of the modifier flags in
Jayson Adams7f27f552021-10-27 20:59:44109 // |modifier_mask|.
Anthony Cui9cc3dd92025-04-23 18:30:54110 std::vector<std::u16string> ShortFormStringForModifiers(int modifier_flags) {
Avi Drissmanae99ae282024-07-22 20:44:28111 ui::KeyEvent key_event(ui::EventType::kKeyPressed, ui::VKEY_F,
112 modifier_flags);
Jayson Adams7f27f552021-10-27 20:59:44113 Accelerator accelerator(key_event);