File indexing completed on 2024-04-28 05:50:34
0001 /* 0002 SPDX-FileCopyrightText: 2013, 2018 Kurt Hindenburg <kurt.hindenburg@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 // Own 0008 #include "KeyboardTranslatorTest.h" 0009 0010 #include "keyboardtranslator/FallbackKeyboardTranslator.h" 0011 #include "keyboardtranslator/KeyboardTranslatorReader.h" 0012 0013 // KDE 0014 #include <QTest> 0015 0016 using namespace Konsole; 0017 0018 Q_DECLARE_METATYPE(Qt::KeyboardModifiers) 0019 0020 void KeyboardTranslatorTest::testEntryTextWildcards_data() 0021 { 0022 // Shift = 1 + (1 << 0) = 2 0023 // Alt = 1 + (1 << 2) = 3 0024 // Control = 1 + (1 << 4) = 5 0025 0026 QTest::addColumn<QByteArray>("text"); 0027 QTest::addColumn<QByteArray>("result"); 0028 QTest::addColumn<bool>("wildcards"); 0029 QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); 0030 0031 QTest::newRow("Home no wildcards no modifiers") << QByteArray("Home") << QByteArray("Home") << false << Qt::KeyboardModifiers(Qt::NoModifier); 0032 QTest::newRow("Home no wildcards Shift modifiers") << QByteArray("Home") << QByteArray("Home") << false << Qt::KeyboardModifiers(Qt::ShiftModifier); 0033 QTest::newRow("Home no wildcards Alt modifiers") << QByteArray("Home") << QByteArray("Home") << false << Qt::KeyboardModifiers(Qt::AltModifier); 0034 QTest::newRow("Home no wildcards Control modifiers") << QByteArray("Home") << QByteArray("Home") << false << Qt::KeyboardModifiers(Qt::ControlModifier); 0035 0036 QTest::newRow("Home yes wildcards no modifiers") << QByteArray("Home") << QByteArray("Home") << true << Qt::KeyboardModifiers(Qt::NoModifier); 0037 QTest::newRow("Home yes wildcards Shift modifiers") << QByteArray("Home") << QByteArray("Home") << true << Qt::KeyboardModifiers(Qt::ShiftModifier); 0038 QTest::newRow("Home yes wildcards Alt modifiers") << QByteArray("Home") << QByteArray("Home") << true << Qt::KeyboardModifiers(Qt::AltModifier); 0039 QTest::newRow("Home yes wildcards Control modifiers") << QByteArray("Home") << QByteArray("Home") << true << Qt::KeyboardModifiers(Qt::ControlModifier); 0040 0041 // text, results: no mod, shift, alt, control 0042 QList<QByteArray> entry; 0043 entry << QByteArray("E*") << QByteArray("E1") << QByteArray("E2") << QByteArray("E3") << QByteArray("E5"); 0044 QTest::newRow("E* yes wildcards no modifiers") << entry[0] << entry[1] << true << Qt::KeyboardModifiers(Qt::NoModifier); 0045 QTest::newRow("E* yes wildcards Shift modifiers") << entry[0] << entry[2] << true << Qt::KeyboardModifiers(Qt::ShiftModifier); 0046 QTest::newRow("E* yes wildcards Alt modifiers") << entry[0] << entry[3] << true << Qt::KeyboardModifiers(Qt::AltModifier); 0047 QTest::newRow("E* yes wildcards Control modifiers") << entry[0] << entry[4] << true << Qt::KeyboardModifiers(Qt::ControlModifier); 0048 0049 // combinations 0050 entry.clear(); 0051 entry << QByteArray("E*") << QByteArray("E4") << QByteArray("E6") << QByteArray("E8") << QByteArray("E7"); 0052 QTest::newRow("E* yes wildcards Shift+Alt modifiers") << entry[0] << entry[1] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::AltModifier); 0053 QTest::newRow("E* yes wildcards Shift+Control modifiers") << entry[0] << entry[2] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::ControlModifier); 0054 QTest::newRow("E* yes wildcards Shift+Alt+Control modifiers") 0055 << entry[0] << entry[3] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::AltModifier | Qt::ControlModifier); 0056 QTest::newRow("E* yes wildcards Alt+Control modifiers") << entry[0] << entry[4] << true << Qt::KeyboardModifiers(Qt::AltModifier | Qt::ControlModifier); 0057 0058 // text, results: no mod, shift, alt, control 0059 entry.clear(); 0060 entry << QByteArray("\033[24;*~") << QByteArray("\033[24;1~") << QByteArray("\033[24;2~") << QByteArray("\033[24;3~") << QByteArray("\033[24;5~"); 0061 QTest::newRow("\033[24;*~ yes wildcards no modifiers") << entry[0] << entry[1] << true << Qt::KeyboardModifiers(Qt::NoModifier); 0062 QTest::newRow("\033[24;*~ yes wildcards Shift modifiers") << entry[0] << entry[2] << true << Qt::KeyboardModifiers(Qt::ShiftModifier); 0063 QTest::newRow("\033[24;*~ yes wildcards Alt modifiers") << entry[0] << entry[3] << true << Qt::KeyboardModifiers(Qt::AltModifier); 0064 QTest::newRow("\033[24;*~ yes wildcards Control modifiers") << entry[0] << entry[4] << true << Qt::KeyboardModifiers(Qt::ControlModifier); 0065 0066 // combinations 0067 entry.clear(); 0068 entry << QByteArray("\033[24;*~") << QByteArray("\033[24;4~") << QByteArray("\033[24;6~") << QByteArray("\033[24;8~") << QByteArray("\033[24;7~"); 0069 QTest::newRow("\033[24;*~ yes wildcards Shift+Alt modifiers") << entry[0] << entry[1] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::AltModifier); 0070 QTest::newRow("\033[24;*~ yes wildcards Shift+Control modifiers") 0071 << entry[0] << entry[2] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::ControlModifier); 0072 QTest::newRow("\033[24;*~ yes wildcards Shift+Alt+Control modifiers") 0073 << entry[0] << entry[3] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::AltModifier | Qt::ControlModifier); 0074 QTest::newRow("\033[24;*~ yes wildcards Alt+Control modifiers") 0075 << entry[0] << entry[4] << true << Qt::KeyboardModifiers(Qt::AltModifier | Qt::ControlModifier); 0076 } 0077 0078 void KeyboardTranslatorTest::testEntryTextWildcards() 0079 { 0080 QFETCH(QByteArray, text); 0081 QFETCH(QByteArray, result); 0082 QFETCH(bool, wildcards); 0083 QFETCH(Qt::KeyboardModifiers, modifiers); 0084 0085 KeyboardTranslator::Entry entry; 0086 entry.setText(text); 0087 0088 QCOMPARE(entry.text(wildcards, modifiers), result); 0089 } 0090 0091 // Use FallbackKeyboardTranslator to test basic functionality 0092 void KeyboardTranslatorTest::testFallback() 0093 { 0094 auto fallback = std::unique_ptr<FallbackKeyboardTranslator>(new FallbackKeyboardTranslator()); 0095 0096 QCOMPARE(QStringLiteral("fallback"), fallback->name()); 0097 QCOMPARE(QStringLiteral("Fallback Keyboard Translator"), fallback->description()); 0098 0099 auto entries = fallback->entries(); 0100 QCOMPARE(1, entries.size()); 0101 auto entry = fallback->findEntry(Qt::Key_Tab, Qt::NoModifier); 0102 QVERIFY(!entry.isNull()); 0103 QCOMPARE(FallbackKeyboardTranslator::Command::NoCommand, entry.command()); 0104 QCOMPARE(int(Qt::Key_Tab), entry.keyCode()); 0105 QCOMPARE(QByteArray("\t"), entry.text()); 0106 QCOMPARE(QByteArray("\\t"), entry.escapedText()); 0107 QCOMPARE(Qt::KeyboardModifiers(Qt::NoModifier), entry.modifiers()); 0108 QCOMPARE(Qt::KeyboardModifiers(Qt::NoModifier), entry.modifierMask()); 0109 QCOMPARE(KeyboardTranslator::States(KeyboardTranslator::NoState), entry.state()); 0110 QCOMPARE(QStringLiteral("Tab"), entry.conditionToString()); 0111 QCOMPARE(QStringLiteral("\\t"), entry.resultToString()); 0112 QVERIFY(entry.matches(Qt::Key_Tab, Qt::NoModifier, KeyboardTranslator::NoState)); 0113 QVERIFY(entry == fallback->findEntry(Qt::Key_Tab, Qt::NoModifier)); 0114 } 0115 0116 void KeyboardTranslatorTest::testHexKeys() 0117 { 0118 QFile linuxkeytab(QFINDTESTDATA(QStringLiteral("data/test.keytab"))); 0119 QVERIFY(linuxkeytab.exists()); 0120 QVERIFY(linuxkeytab.open(QIODevice::ReadOnly)); 0121 0122 auto translator = std::unique_ptr<KeyboardTranslator>(new KeyboardTranslator(QStringLiteral("testtranslator"))); 0123 0124 KeyboardTranslatorReader reader(&linuxkeytab); 0125 while (reader.hasNextEntry()) { 0126 translator->addEntry(reader.nextEntry()); 0127 } 0128 linuxkeytab.close(); 0129 0130 // A worthless check ATM 0131 if (reader.parseError()) { 0132 QFAIL("Parse failure"); 0133 } 0134 0135 QCOMPARE(QStringLiteral("testtranslator"), translator->name()); 0136 QCOMPARE(QString(), translator->description()); 0137 0138 auto entry = translator->findEntry(Qt::Key_Backspace, Qt::NoModifier); 0139 QVERIFY(!entry.isNull()); 0140 QCOMPARE(FallbackKeyboardTranslator::Command::NoCommand, entry.command()); 0141 QCOMPARE(int(Qt::Key_Backspace), entry.keyCode()); 0142 QCOMPARE(QByteArray("\x7F"), entry.text()); 0143 QCOMPARE(QByteArray("\\x7f"), entry.escapedText()); 0144 QCOMPARE(Qt::KeyboardModifiers(Qt::NoModifier), entry.modifiers()); 0145 QCOMPARE(Qt::KeyboardModifiers(Qt::NoModifier), entry.modifierMask()); 0146 QCOMPARE(KeyboardTranslator::States(KeyboardTranslator::NoState), entry.state()); 0147 QCOMPARE(QStringLiteral("Backspace"), entry.conditionToString()); 0148 QCOMPARE(QStringLiteral("\\x7f"), entry.resultToString()); 0149 QVERIFY(entry.matches(Qt::Key_Backspace, Qt::NoModifier, KeyboardTranslator::NoState)); 0150 QVERIFY(entry == translator->findEntry(Qt::Key_Backspace, Qt::NoModifier)); 0151 0152 entry = translator->findEntry(Qt::Key_Delete, Qt::NoModifier); 0153 QVERIFY(!entry.isNull()); 0154 QCOMPARE(FallbackKeyboardTranslator::Command::NoCommand, entry.command()); 0155 QCOMPARE(int(Qt::Key_Delete), entry.keyCode()); 0156 QCOMPARE(QByteArray("\x08"), entry.text()); 0157 QCOMPARE(QByteArray("\\b"), entry.escapedText()); 0158 QCOMPARE(Qt::KeyboardModifiers(Qt::NoModifier), entry.modifiers()); 0159 QCOMPARE(Qt::KeyboardModifiers(Qt::NoModifier), entry.modifierMask()); 0160 QCOMPARE(KeyboardTranslator::States(KeyboardTranslator::NoState), entry.state()); 0161 QCOMPARE(QStringLiteral("Del"), entry.conditionToString()); 0162 QCOMPARE(QStringLiteral("\\b"), entry.resultToString()); 0163 QVERIFY(entry.matches(Qt::Key_Delete, Qt::NoModifier, KeyboardTranslator::NoState)); 0164 QVERIFY(!entry.matches(Qt::Key_Backspace, Qt::NoModifier, KeyboardTranslator::NoState)); 0165 QVERIFY(!(entry == translator->findEntry(Qt::Key_Backspace, Qt::NoModifier))); 0166 0167 entry = translator->findEntry(Qt::Key_Space, Qt::NoModifier); 0168 QVERIFY(!entry.isNull()); 0169 QCOMPARE(FallbackKeyboardTranslator::Command::NoCommand, entry.command()); 0170 QCOMPARE(int(Qt::Key_Space), entry.keyCode()); 0171 QEXPECT_FAIL("", "Several keytabs use x00 as Space +Control; text() fails", Continue); 0172 QCOMPARE(QByteArray("\x00"), entry.text()); 0173 QCOMPARE(QByteArray("\\x00"), entry.escapedText()); 0174 QCOMPARE(Qt::KeyboardModifiers(Qt::NoModifier), entry.modifiers()); 0175 QCOMPARE(Qt::KeyboardModifiers(Qt::NoModifier), entry.modifierMask()); 0176 QCOMPARE(KeyboardTranslator::States(KeyboardTranslator::NoState), entry.state()); 0177 QCOMPARE(QStringLiteral("Space"), entry.conditionToString()); 0178 QCOMPARE(QStringLiteral("\\x00"), entry.resultToString()); 0179 QVERIFY(entry.matches(Qt::Key_Space, Qt::NoModifier, KeyboardTranslator::NoState)); 0180 QVERIFY(entry == translator->findEntry(Qt::Key_Space, Qt::NoModifier)); 0181 QVERIFY(!entry.matches(Qt::Key_Backspace, Qt::NoModifier, KeyboardTranslator::NoState)); 0182 QVERIFY(!(entry == translator->findEntry(Qt::Key_Backspace, Qt::NoModifier))); 0183 } 0184 0185 QTEST_GUILESS_MAIN(KeyboardTranslatorTest) 0186 0187 #include "moc_KeyboardTranslatorTest.cpp"