Files
sloposk/tests/tst_layoutloader.cpp
T
ericek111andClaude Opus 5.5 5277ab16ff Fix double-space period, shift double-tap; settings; letters from system keymap
- Double-space replaced the space via a Backspace keysym, which clients
  apply after the commit: use delete_surrounding_text with the commit
- Tests use a shared FakeEngine that applies ops to a simulated field
- Double-tap shift locks at a sentence start; typing between taps doesn't
- Organization name set: config lives in ~/.config/sloposk/
- Settings (auto-capitalization, double-space period) with a ⚙ panel
- Letter rows come from the compositor's XKB keymap; other letters of the
  layout become long-press alternates; globe switches the system layout
  over org.kde.keyboard
- One JSON template for non-letter layers; stretch keys even out rows

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:28:39 +02:00

92 lines
2.8 KiB
C++

#include "TestLayouts.h"
#include "layout/KeyGeometry.h"
#include "layout/LayoutLoader.h"
#include <QTest>
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<QString>("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"