/* * Copyright (C) 2011 Andriy Rysin (rysin@kde.org) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "../xkb_rules.h" #include #include static const Rules::ExtrasFlag readExtras = Rules::NO_EXTRAS; class RulesTest : public QObject { Q_OBJECT Rules* rules; private Q_SLOTS: void initTestCase() { rules = Rules::readRules(readExtras); } void cleanupTestCase() { delete rules; } void testRules() { QVERIFY( rules != nullptr ); QVERIFY( rules->modelInfos.size() > 0 ); QVERIFY( rules->layoutInfos.size() > 0 ); QVERIFY( rules->optionGroupInfos.size() > 0 ); } void testModel() { foreach(const ModelInfo* modelInfo, rules->modelInfos) { QVERIFY( modelInfo != nullptr); QVERIFY( modelInfo->name.length() > 0 ); QVERIFY( modelInfo->description.length() > 0 ); // QVERIFY( ! modelInfo->vendor.isEmpty() ); } } void testLayouts() { foreach(const LayoutInfo* layoutInfo, rules->layoutInfos) { QVERIFY( layoutInfo != nullptr); QVERIFY( ! layoutInfo->name.isEmpty() ); // const char* desc = layoutInfo->name.toUtf8() ; // qDebug() << layoutInfo->name; QVERIFY( ! layoutInfo->description.isEmpty() ); foreach(const VariantInfo* variantInfo, layoutInfo->variantInfos) { QVERIFY( variantInfo != nullptr ); QVERIFY( ! variantInfo->name.isEmpty() ); QVERIFY( ! variantInfo->description.isEmpty() ); } foreach(const QString& language, layoutInfo->languages) { QVERIFY( ! language.isEmpty() ); } } } void testOptionGroups() { foreach(const OptionGroupInfo* optionGroupInfo, rules->optionGroupInfos) { QVERIFY( optionGroupInfo != nullptr); QVERIFY( ! optionGroupInfo->name.isEmpty() ); QVERIFY( ! optionGroupInfo->description.isEmpty() ); // optionGroupInfo->exclusive foreach(const OptionInfo* optionInfo, optionGroupInfo->optionInfos) { QVERIFY( optionInfo != nullptr ); QVERIFY( ! optionInfo->name.isEmpty() ); QVERIFY( ! optionInfo->description.isEmpty() ); } } } void testExtras() { Rules* rulesWithExtras = Rules::readRules(Rules::READ_EXTRAS); QVERIFY2(rulesWithExtras->layoutInfos.size() > rules->layoutInfos.size(), "Rules with extras should have more layouts"); foreach(const LayoutInfo* layoutInfo, rules->layoutInfos) { QVERIFY( ! layoutInfo->fromExtras ); } bool foundFromExtras = false, foundNonExtras = false; foreach(const LayoutInfo* layoutInfo, rulesWithExtras->layoutInfos) { if( layoutInfo->fromExtras ) foundFromExtras = true; if( ! layoutInfo->fromExtras ) foundNonExtras = true; layoutInfo->languages.size(); // make sure we can access all merged objects layoutInfo->variantInfos.size(); // make sure we can access all merged objects } QVERIFY( foundNonExtras ); QVERIFY( foundFromExtras ); } void testWriteNewXml() { QDomDocument doc(QStringLiteral("xkbConfigRegistry")); QDomElement root = doc.createElement(QStringLiteral("xkbConfigRegistry")); root.setAttribute(QStringLiteral("version"), QStringLiteral("2.0")); doc.appendChild(root); QDomElement modelList = doc.createElement(QStringLiteral("modelList")); root.appendChild(modelList); foreach(const ModelInfo* modelInfo, rules->modelInfos) { QDomElement model = doc.createElement(QStringLiteral("model")); model.setAttribute(QStringLiteral("name"), modelInfo->name); model.setAttribute(QStringLiteral("description"), modelInfo->description); model.setAttribute(QStringLiteral("vendor"), modelInfo->vendor); modelList.appendChild(model); } QDomElement layoutList = doc.createElement(QStringLiteral("layoutList")); foreach(const LayoutInfo* layoutInfo, rules->layoutInfos) { QDomElement layout = doc.createElement(QStringLiteral("layout")); layout.setAttribute(QStringLiteral("name"), layoutInfo->name); layout.setAttribute(QStringLiteral("description"), layoutInfo->description); QDomElement langList = doc.createElement(QStringLiteral("languageList")); foreach(const QString& lang, layoutInfo->languages) { QDomElement langNode = doc.createElement(QStringLiteral("lang")); langNode.setAttribute(QStringLiteral("iso639Id"), lang); langList.appendChild(langNode); } if( langList.hasChildNodes() ) { layout.appendChild(langList); } QDomElement variantList = doc.createElement(QStringLiteral("variantList")); foreach(const VariantInfo* variantInfo, layoutInfo->variantInfos) { QDomElement variant = doc.createElement(QStringLiteral("variant")); variant.setAttribute(QStringLiteral("name"), variantInfo->name); variant.setAttribute(QStringLiteral("description"), variantInfo->description); QDomElement langList = doc.createElement(QStringLiteral("languageList")); foreach(const QString& lang, variantInfo->languages) { QDomElement langNode = doc.createElement(QStringLiteral("lang")); langNode.setAttribute(QStringLiteral("iso639Id"), lang); langList.appendChild(langNode); } if( langList.hasChildNodes() ) { variant.appendChild(langList); } variantList.appendChild(variant); } if( variantList.hasChildNodes() ) { layout.appendChild(variantList); } layoutList.appendChild(layout); } root.appendChild(layoutList); QDomElement optionGroupList = doc.createElement(QStringLiteral("optionList")); foreach(const OptionGroupInfo* optionGroupInfo, rules->optionGroupInfos) { QDomElement optionGroup = doc.createElement(QStringLiteral("optionGroup")); optionGroup.setAttribute(QStringLiteral("name"), optionGroupInfo->name); optionGroup.setAttribute(QStringLiteral("description"), optionGroupInfo->description); optionGroup.setAttribute(QStringLiteral("exclusive"), optionGroupInfo->exclusive); foreach(const OptionInfo* optionGroupInfo, optionGroupInfo->optionInfos) { QDomElement option = doc.createElement(QStringLiteral("option")); option.setAttribute(QStringLiteral("name"), optionGroupInfo->name); option.setAttribute(QStringLiteral("description"), optionGroupInfo->description); optionGroup.appendChild(option); } optionGroupList.appendChild(optionGroup); } root.appendChild(optionGroupList); QFile file(QStringLiteral("base2.xml")); if( ! file.open( QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text) ) { qWarning() << "Failed to open layout memory xml file for writing" << file.fileName(); QFAIL("failed"); } QTextStream out(&file); out << doc.toString(); } void testRulesVersion() { QVERIFY(!rules->version.isEmpty()); Rules* rules10 = new Rules(); Rules::readRules(rules10, QStringLiteral("config/base.xml"), false); QCOMPARE(rules10->version, QString("1.0")); delete rules10; Rules* rules11 = new Rules(); Rules::readRules(rules11, QStringLiteral("config/base.1.1.xml"), false); QCOMPARE(rules11->version, QString("1.1")); foreach(const LayoutInfo* layoutInfo, rules11->layoutInfos) { QVERIFY( layoutInfo != nullptr); QVERIFY( ! layoutInfo->name.isEmpty() ); QVERIFY( ! layoutInfo->description.isEmpty() ); foreach(const VariantInfo* variantInfo, layoutInfo->variantInfos) { QVERIFY( variantInfo != nullptr ); QVERIFY( ! variantInfo->name.isEmpty() ); QVERIFY( ! variantInfo->description.isEmpty() ); } } delete rules11; } void loadRulesBenchmark() { QBENCHMARK { Rules* rules = Rules::readRules(readExtras); delete rules; } } }; // need kde libs for config-workspace.h used in xkb_rules.cpp QTEST_MAIN(RulesTest) #include "xkb_rules_test.moc"