#include "TestLayouts.h" #include "layout/KeyGeometry.h" #include "layout/LayoutLoader.h" #include using namespace Qt::StringLiterals; class TestLayoutLoader : public QObject { Q_OBJECT private Q_SLOTS: void parsesStringAndObjectKeys() { QString error; const auto layout = LayoutLoader::parse(R"({ "id": "t", "layers": [{"name": "letters", "rows": [[ "q", {"label": "e", "flick": "3", "alternates": ["é", "è"]}, {"type": "backspace", "width": 1.5} ]]}] })", &error); QVERIFY2(layout, qPrintable(error)); const Row &row = layout->layers.first().rows.first(); QCOMPARE(row.size(), 3); QCOMPARE(row[0].label, u"q"); QCOMPARE(row[1].flick, u"3"); QCOMPARE(row[1].alternates, QStringList({u"é"_s, u"è"_s})); QCOMPARE(row[2].type, KeyType::Backspace); QCOMPARE(row[2].width, 1.5); } void rejectsUnknownKeyType() { QString error; QVERIFY(!LayoutLoader::parse(R"({"id": "t", "layers": [{"name": "l", "rows": [[{"type": "warp"}]]}]})", &error)); QVERIFY(error.contains(u"warp")); } void rejectsMissingId() { QString error; QVERIFY(!LayoutLoader::parse(R"({"layers": []})", &error)); } void validateCatchesUnknownLayerTarget() { QString error; const auto layout = LayoutLoader::parse( R"({"id": "t", "layers": [{"name": "l", "rows": [[{"type": "layer", "target": "nope"}]]}]})", &error); QVERIFY(layout); QVERIFY(!LayoutLoader::validate(*layout, &error)); } void templateIsValid() { QString error; QVERIFY2(LayoutLoader::validate(TestLayouts::builtinTemplate(), &error), qPrintable(error)); } void rejectsLettersWithoutRow() { QString error; QVERIFY(!LayoutLoader::parse(R"({"id": "t", "layers": [{"name": "l", "rows": [[{"type": "letters"}]]}]})", &error)); } // Stretching must even out rows whatever the keymap's letter counts. void builtLayersHaveEqualRows_data() { QTest::addColumn("xkbLayout"); for (const char *layout : {"us", "sk", "se", "de", "fr", "ru", "gr"}) QTest::newRow(layout) << QString::fromLatin1(layout); } void builtLayersHaveEqualRows() { QFETCH(QString, xkbLayout); const Layout layout = TestLayouts::build(qPrintable(xkbLayout)); for (const Layer &layer : layout.layers) { const qreal expected = rowUnits(layer.rows.first()); for (const Row &row : layer.rows) QVERIFY2(qFuzzyCompare(rowUnits(row), expected), qPrintable(layer.name)); } } }; QTEST_GUILESS_MAIN(TestLayoutLoader) #include "tst_layoutloader.moc"