File: testkey.cpp

package info (click to toggle)
fcitx5 5.1.17-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 17,356 kB
  • sloc: cpp: 75,670; sh: 1,770; xml: 1,545; python: 1,052; ansic: 71; makefile: 11
file content (168 lines) | stat: -rw-r--r-- 7,362 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*
 * SPDX-FileCopyrightText: 2016-2016 CSSlayer <wengxt@gmail.com>
 *
 * SPDX-License-Identifier: LGPL-2.1-or-later
 *
 */

#include <cstdio>
#include <cstring>
#include "fcitx-utils/key.h"
#include "fcitx-utils/keydata.h"
#include "fcitx-utils/keynametable-compat.h"
#include "fcitx-utils/keynametable.h"
#include "fcitx-utils/keysym.h"
#include "fcitx-utils/log.h"
#include "fcitx-utils/macros.h"

#define CHECK_ARRAY_ORDER(ARRAY, COMPARE_FUNC)                                 \
    for (size_t i = 0; i < FCITX_ARRAY_SIZE(ARRAY) - 1; i++) {                 \
        FCITX_ASSERT(COMPARE_FUNC(ARRAY[i], ARRAY[i + 1])) << i;               \
    }

int main() {
#define _STRING_LESS(A, B) (strcmp((A), (B)) < 0)
#define _STRING_LESS_2(A, B) (strcmp((A).name, (B).name) < 0)
#define _SYM_LESS(A, B) ((A).sym < (B).sym)
#define _KEYSYM_LESS(A, B) ((A).keysym < (B).keysym)

    CHECK_ARRAY_ORDER(keyNameList, _STRING_LESS);
    CHECK_ARRAY_ORDER(keyNameOffsetByValue, _SYM_LESS);
    CHECK_ARRAY_ORDER(keyNameListCompat, _STRING_LESS_2);
    CHECK_ARRAY_ORDER(fcitx::keysym_to_unicode_tab, _KEYSYM_LESS);

    // Test convert
    for (size_t i = 0; i < FCITX_ARRAY_SIZE(keyValueByNameOffset); i++) {
        FCITX_ASSERT(!fcitx::Key::keySymToString(
                          static_cast<fcitx::KeySym>(keyValueByNameOffset[i]))
                          .empty());
        FCITX_ASSERT(fcitx::Key::keySymFromString(keyNameList[i]) ==
                     keyValueByNameOffset[i]);
    }

    const std::pair<FcitxKeySym, uint32_t> keySymUnicode[]{
        {FcitxKey_BackSpace, '\b'}, {FcitxKey_Tab, '\t'},
        {FcitxKey_Linefeed, '\n'},  {FcitxKey_Clear, '\v'},
        {FcitxKey_Return, '\r'},    {FcitxKey_Escape, '\033'},
        {FcitxKey_space, ' '},
    };

    for (const auto &pair : keySymUnicode) {
        FCITX_ASSERT(fcitx::Key::keySymToUnicode(pair.first) == pair.second);
        FCITX_ASSERT(fcitx::Key::keySymFromUnicode(pair.second) == pair.first);
    }
    FCITX_ASSERT(fcitx::Key::keySymFromUnicode(' ') == FcitxKey_space);
    FCITX_ASSERT(fcitx::Key("1").isDigit());
    FCITX_ASSERT(fcitx::Key(FcitxKey_KP_7).isDigit());
    FCITX_ASSERT(fcitx::Key(FcitxKey_KP_6).digit() == 6);
    FCITX_ASSERT(fcitx::Key(FcitxKey_3).digit() == 3);
    FCITX_ASSERT(fcitx::Key(FcitxKey_space).digit() == -1);
    FCITX_ASSERT(fcitx::Key(FcitxKey_KP_5).digitSelection() == 4);
    FCITX_ASSERT(fcitx::Key("Control+KP_3").digitSelection() == -1);
    FCITX_ASSERT(
        fcitx::Key("Control+KP_3").digitSelection(fcitx::KeyState::Ctrl) == 2);
    FCITX_ASSERT(!fcitx::Key("Ctrl+1").isDigit());
    FCITX_ASSERT(!fcitx::Key("a").isDigit());
    FCITX_ASSERT(fcitx::Key("a").isLAZ());
    FCITX_ASSERT(!fcitx::Key("Shift_L").isLAZ());
    FCITX_ASSERT(fcitx::Key("A").isUAZ());
    FCITX_ASSERT(!fcitx::Key("BackSpace").isUAZ());
    FCITX_ASSERT(fcitx::Key("space").isSimple());
    FCITX_ASSERT(!fcitx::Key("EuroSign").isSimple());
    FCITX_ASSERT(fcitx::Key("Control+Alt_L").isModifier());
    FCITX_ASSERT(!fcitx::Key("a").isModifier());
    FCITX_ASSERT(fcitx::Key("Left").isCursorMove());
    FCITX_ASSERT(!fcitx::Key("Cancel").isCursorMove());
    FCITX_ASSERT(fcitx::Key("S").check(fcitx::Key("Shift+S").normalize()));
    FCITX_ASSERT(
        fcitx::Key("Shift+F4").check(fcitx::Key("Shift+F4").normalize()));
    FCITX_ASSERT(
        fcitx::Key("Shift+Tab").check(fcitx::Key("Shift+Tab").normalize()));
    FCITX_ASSERT(fcitx::Key("Shift+Return")
                     .check(fcitx::Key("Shift+Return").normalize()));
    FCITX_ASSERT(
        fcitx::Key("Shift+space").check(fcitx::Key("Shift+space").normalize()));
    FCITX_ASSERT(
        fcitx::Key("Control+A").check(fcitx::Key("Control+a").normalize()));
    FCITX_ASSERT(fcitx::Key("Alt+exclam")
                     .check(fcitx::Key("Alt+Shift+exclam").normalize()));
    FCITX_ASSERT(fcitx::Key("").sym() == FcitxKey_None);
    FCITX_ASSERT(fcitx::Key("-").sym() == FcitxKey_minus);
    FCITX_ASSERT(fcitx::Key("`").sym() == FcitxKey_grave);
    FCITX_ASSERT(fcitx::Key("Alt+Shift+Shift_L")
                     .isReleaseOfModifier(fcitx::Key("Alt+Shift_L")));
    FCITX_ASSERT(!fcitx::Key("Alt+Shift+Shift_R")
                      .isReleaseOfModifier(fcitx::Key("Alt+Shift_L")));
    FCITX_ASSERT(fcitx::Key("Alt+Shift+Meta_L")
                     .isReleaseOfModifier(fcitx::Key("Alt+Shift_L")));
    FCITX_ASSERT(fcitx::Key("Alt+Shift+Meta_R")
                     .isReleaseOfModifier(fcitx::Key("Alt+Shift_L")));
    FCITX_ASSERT(!fcitx::Key("Shift+Shift_L")
                      .isReleaseOfModifier(fcitx::Key("Alt+Shift_L")));
    FCITX_ASSERT(fcitx::Key(FcitxKey_space, fcitx::KeyState::Super2)
                     .normalize()
                     .states() == fcitx::KeyState::Super);
    FCITX_ASSERT(fcitx::Key(FcitxKey_space, fcitx::KeyState::Super2)
                     .check(fcitx::Key("Super+space")));
    FCITX_ASSERT(!fcitx::Key(FcitxKey_None).check(fcitx::Key(FcitxKey_None)));

    // Test complex parse
    auto keyList = fcitx::Key::keyListFromString(
        "CTRL_A Control+B Control+Alt+c Control+Alt+Shift+d "
        "Control+Alt+Shift+Super+E Super+Alt+=");

    fcitx::Key hotkey[] = {
        fcitx::Key(FcitxKey_A, fcitx::KeyState::Ctrl),
        fcitx::Key(FcitxKey_B, fcitx::KeyState::Ctrl),
        fcitx::Key(FcitxKey_c, fcitx::KeyState::Ctrl_Alt),
        fcitx::Key(FcitxKey_d, fcitx::KeyState::Ctrl_Alt_Shift),
        fcitx::Key(FcitxKey_E,
                   fcitx::KeyStates({fcitx::KeyState::Ctrl_Alt_Shift,
                                     fcitx::KeyState::Super})),
        fcitx::Key(FcitxKey_equal, fcitx::KeyStates({fcitx::KeyState::Super,
                                                     fcitx::KeyState::Alt})),
    };

    for (size_t i = 0; i < FCITX_ARRAY_SIZE(hotkey); i++) {
        FCITX_ASSERT(hotkey[i].checkKeyList(keyList));
    }

    keyList.emplace_back(FcitxKey_A);

    auto keyString = fcitx::Key::keyListToString(keyList);
    FCITX_ASSERT(keyString ==
                 "Control+A Control+B Control+Alt+c Control+Alt+Shift+d "
                 "Control+Alt+Shift+Super+E Alt+Super+equal A");

    keyList.clear();
    keyString = fcitx::Key::keyListToString(keyList);
    FCITX_ASSERT(keyString.empty());

    fcitx::Key modifier = fcitx::Key("Control_L").normalize();
    FCITX_ASSERT(modifier.check(fcitx::Key("Control+Control_L")));
    FCITX_ASSERT(modifier.check(fcitx::Key("Control_L")));

    FCITX_ASSERT(
        fcitx::Key(FcitxKey_a, fcitx::KeyState::NumLock).normalize().sym() ==
        FcitxKey_a);

    FCITX_ASSERT(
        fcitx::Key("Control+<25>")
            .check(fcitx::Key::fromKeyCode(25, fcitx::KeyState::Ctrl)));
    FCITX_ASSERT(
        fcitx::Key::fromKeyCode(25, fcitx::KeyState::Ctrl).toString() ==
        "Control+<25>");

    FCITX_ASSERT(fcitx::Key("Hyper+a").toString() == "Hyper+a");
    FCITX_ASSERT(fcitx::Key("Hyper+space")
                     .check(FcitxKey_space, fcitx::KeyState::Hyper));

    FCITX_INFO() << fcitx::Key::keySymToString(
        FcitxKey_Insert, fcitx::KeyStringFormat::Localized);
    FCITX_ASSERT(fcitx::Key::keySymToUnicode(
                     static_cast<fcitx::KeySym>(0x100fdd7)) == 0xfdd7);
    FCITX_ASSERT(fcitx::Key::keySymToUnicode(
                     static_cast<fcitx::KeySym>(0x120fdd7)) == 0);

    return 0;
}