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"