From 4105f37f40ab62c350e22f30ec50e27d366aecca Mon Sep 17 00:00:00 2001 From: Skycoder42 Date: Sat, 14 Jul 2018 22:38:16 +0200 Subject: [PATCH] create test template with included tool --- mkspecs/features/qsettingsgenerator.prf | 58 +++++++++++++++++++ mkspecs/features/qsettingstranslator.prf | 25 -------- src/mvvmcore/mvvmcore.pro | 13 ++--- tests/auto/mvvmcore/mvvmcore.pro | 3 + .../mvvmcore/settingsgenerator/settings.xml | 3 + .../settingsgenerator/settingsgenerator.pro | 14 +++++ .../tst_settingsgenerator.cpp | 35 +++++++++++ tools/settingsgenerator/qpmx.json | 2 +- tools/settingsgenerator/settingsgenerator.cpp | 45 ++++++++++---- 9 files changed, 153 insertions(+), 45 deletions(-) create mode 100644 mkspecs/features/qsettingsgenerator.prf delete mode 100644 mkspecs/features/qsettingstranslator.prf create mode 100644 tests/auto/mvvmcore/settingsgenerator/settings.xml create mode 100644 tests/auto/mvvmcore/settingsgenerator/settingsgenerator.pro create mode 100644 tests/auto/mvvmcore/settingsgenerator/tst_settingsgenerator.cpp diff --git a/mkspecs/features/qsettingsgenerator.prf b/mkspecs/features/qsettingsgenerator.prf new file mode 100644 index 0000000..67bbd2a --- /dev/null +++ b/mkspecs/features/qsettingsgenerator.prf @@ -0,0 +1,58 @@ +isEmpty(QMAKE_QSETTINGSGENERATOR): qtPrepareTool(QMAKE_QSETTINGSGENERATOR, qsettingsgenerator) + +isEmpty(QSETTINGSGENERATOR_DIR): QSETTINGSGENERATOR_DIR = . +isEmpty(MOC_DIR): MOC_DIR = . +isEmpty(QSETTINGSTRANSLATOR_DIR): QSETTINGSTRANSLATOR_DIR = $$_PRO_FILE_PWD_/.ts-dummy + +!ReleaseBuild:!DebugBuild: { + qsettingstranslator_c.name = qsettingsgenerator --translate ${QMAKE_FILE_IN} + qsettingstranslator_c.input = SETTINGS_TRANSLATIONS #TODO compability + qsettingstranslator_c.variable_out = CPP_DUMMIES + qsettingstranslator_c.commands = $$QMAKE_QSETTINGSGENERATOR --translate --in ${QMAKE_FILE_IN} --impl ${QMAKE_FILE_OUT} + qsettingstranslator_c.output = $$QSETTINGSTRANSLATOR_DIR/${QMAKE_FILE_BASE}.tsdummy$${first(QMAKE_EXT_CPP)} + qsettingstranslator_c.CONFIG += no_link + qsettingstranslator_c.depends += $$QMAKE_QSETTINGSGENERATOR_EXE + + QMAKE_EXTRA_COMPILERS += qsettingstranslator_c + + qtmvvm_tsgen_target.target = qtmvvm-tsgen + qtmvvm_tsgen_target.depends += compiler_qsettingstranslator_c_make_all + qtmvvm_tsgen_target.commands += @echo $$shell_quote(>>> Remember to add the line \"_never_true_condition: SOURCES += $${LITERAL_DOLLAR}$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}files($${LITERAL_DOLLAR}$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PWD/.ts-dummy/*)\" to your pro file) + QMAKE_EXTRA_TARGETS += qtmvvm_tsgen_target +} else { + qtmvvm_tsgen_target.target = qtmvvm-tsgen + QMAKE_EXTRA_TARGETS += qtmvvm_tsgen_target +} + +{ + qsettingsgenerator_c.name = qsettingsgenerator ${QMAKE_FILE_IN}.h + qsettingsgenerator_c.input = SETTINGS_DEFINITIONS + qsettingsgenerator_c.variable_out = QSETTINGSGENERATOR_HEADERS + qsettingsgenerator_c.commands = $$QMAKE_QSETTINGSGENERATOR --in ${QMAKE_FILE_IN} --header ${QMAKE_FILE_OUT} --impl $$QSETTINGSGENERATOR_DIR/${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)} + qsettingsgenerator_c.output = $$QSETTINGSGENERATOR_DIR/${QMAKE_FILE_BASE}$${first(QMAKE_EXT_H)} + qsettingsgenerator_c.CONFIG += target_predeps + qsettingsgenerator_c.depends += $$QMAKE_QSETTINGSGENERATOR_EXE + QMAKE_EXTRA_COMPILERS += qsettingsgenerator_c + + qsettingsgenerator_m.name = qsettingsgenerator moc ${QMAKE_FILE_IN} + qsettingsgenerator_m.input = QSETTINGSGENERATOR_HEADERS + qsettingsgenerator_m.variable_out = GENERATED_SOURCES + qsettingsgenerator_m.commands = ${QMAKE_FUNC_mocCmdBase} ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} + qsettingsgenerator_m.output = $$MOC_DIR/$${QMAKE_H_MOD_MOC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)} + qsettingsgenerator_m.CONFIG += target_predeps + qsettingsgenerator_m.depends += $$QMAKE_QSETTINGSGENERATOR_EXE $$WIN_INCLUDETEMP $$moc_predefs.output + qsettingsgenerator_m.dependency_type = TYPE_C + QMAKE_EXTRA_COMPILERS += qsettingsgenerator_m + + qsettingsgenerator_s.name = qsettingsgenerator src ${QMAKE_FILE_IN}.cpp + qsettingsgenerator_s.input = QSETTINGSGENERATOR_HEADERS + qsettingsgenerator_s.variable_out = GENERATED_SOURCES + qsettingsgenerator_s.commands = $$escape_expand(\\n) # force creation of rule + qsettingsgenerator_s.output = $$QSETTINGSGENERATOR_DIR/${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)} + qsettingsgenerator_s.CONFIG += target_predeps + QMAKE_EXTRA_COMPILERS += qsettingsgenerator_s +} + +INCLUDEPATH += $$absolute_path($$QSETTINGSGENERATOR_DIR, $$OUT_PWD) +QMAKE_DIR_REPLACE += QSETTINGSGENERATOR_DIR +QMAKE_DIR_REPLACE_SANE += QSETTINGSGENERATOR_DIR diff --git a/mkspecs/features/qsettingstranslator.prf b/mkspecs/features/qsettingstranslator.prf deleted file mode 100644 index f8523a9..0000000 --- a/mkspecs/features/qsettingstranslator.prf +++ /dev/null @@ -1,25 +0,0 @@ -isEmpty(QMAKE_QSETTINGSTRANSLATOR): qtPrepareTool(QMAKE_QSETTINGSTRANSLATOR, qsettingstranslator.py) -isEmpty(QSETTINGSTRANSLATOR_DIR): QSETTINGSTRANSLATOR_DIR = $$_PRO_FILE_PWD_/.ts-dummy - -!ReleaseBuild:!DebugBuild: { - qsettingstranslator_c.name = QSETTINGSTRANSLATOR of ${QMAKE_FILE_IN} - qsettingstranslator_c.input = QTMVVM_TS_SETTINGS - qsettingstranslator_c.variable_out = CPP_DUMMIES - qsettingstranslator_c.commands = $$QMAKE_QSETTINGSTRANSLATOR ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} - qsettingstranslator_c.output = $$QSETTINGSTRANSLATOR_DIR/${QMAKE_FILE_BASE}.tsdummy$${first(QMAKE_EXT_CPP)} - qsettingstranslator_c.CONFIG += no_link - qsettingstranslator_c.depends += $$QMAKE_QSETTINGSTRANSLATOR - - QMAKE_EXTRA_COMPILERS += qsettingstranslator_c - - qtmvvm_tsgen_target.target = qtmvvm-tsgen - qtmvvm_tsgen_target.depends += compiler_qsettingstranslator_c_make_all - qtmvvm_tsgen_target.commands += @echo $$shell_quote(>>> Remember to add the line \"_never_true_condition: SOURCES += $${LITERAL_DOLLAR}$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}files($${LITERAL_DOLLAR}$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PWD/.ts-dummy/*)\" to your pro file) - QMAKE_EXTRA_TARGETS += qtmvvm_tsgen_target -} else { - qtmvvm_tsgen_target.target = qtmvvm-tsgen - QMAKE_EXTRA_TARGETS += qtmvvm_tsgen_target -} - -QMAKE_DIR_REPLACE += QSETTINGSTRANSLATOR_DIR -QMAKE_DIR_REPLACE_SANE += QSETTINGSTRANSLATOR_DIR diff --git a/src/mvvmcore/mvvmcore.pro b/src/mvvmcore/mvvmcore.pro index 945f2a2..1ebaf5f 100644 --- a/src/mvvmcore/mvvmcore.pro +++ b/src/mvvmcore/mvvmcore.pro @@ -1,7 +1,7 @@ TARGET = QtMvvmCore QT = core gui -MODULE_CONFIG += qsettingstranslator +MODULE_CONFIG += qsettingsgenerator HEADERS += \ viewmodel.h \ @@ -44,23 +44,18 @@ TRANSLATIONS += \ translations/qtmvvmcore_de.ts \ translations/qtmvvmcore_template.ts -DISTFILES += $$TRANSLATIONS \ - settings.xsd +DISTFILES += $$TRANSLATIONS load(qt_module) qpmx_ts_target.path = $$[QT_INSTALL_TRANSLATIONS] qpmx_ts_target.depends += lrelease -FEATURES += ../../mkspecs/features/qsettingstranslator.prf +FEATURES += ../../mkspecs/features/qsettingsgenerator.prf features.files = $$FEATURES features.path = $$[QT_HOST_DATA]/mkspecs/features/ -SCRIPTS += ../../bin/qsettingstranslator.py -scripts.files = $$SCRIPTS -scripts.path = $$[QT_INSTALL_BINS] - -INSTALLS += qpmx_ts_target features scripts +INSTALLS += qpmx_ts_target features win32 { QMAKE_TARGET_PRODUCT = "$$TARGET" diff --git a/tests/auto/mvvmcore/mvvmcore.pro b/tests/auto/mvvmcore/mvvmcore.pro index 9671085..bc3a8df 100644 --- a/tests/auto/mvvmcore/mvvmcore.pro +++ b/tests/auto/mvvmcore/mvvmcore.pro @@ -1 +1,4 @@ TEMPLATE = subdirs + +SUBDIRS += \ + settingsgenerator diff --git a/tests/auto/mvvmcore/settingsgenerator/settings.xml b/tests/auto/mvvmcore/settingsgenerator/settings.xml new file mode 100644 index 0000000..d5c7acd --- /dev/null +++ b/tests/auto/mvvmcore/settingsgenerator/settings.xml @@ -0,0 +1,3 @@ + + + diff --git a/tests/auto/mvvmcore/settingsgenerator/settingsgenerator.pro b/tests/auto/mvvmcore/settingsgenerator/settingsgenerator.pro new file mode 100644 index 0000000..cb51453 --- /dev/null +++ b/tests/auto/mvvmcore/settingsgenerator/settingsgenerator.pro @@ -0,0 +1,14 @@ +TEMPLATE = app + +QT += testlib mvvmcore +QT -= gui +CONFIG += console +CONFIG -= app_bundle + +TARGET = tst_settingsgenerator + +SOURCES += \ + tst_settingsgenerator.cpp + +SETTINGS_DEFINITIONS += \ + settings.xml diff --git a/tests/auto/mvvmcore/settingsgenerator/tst_settingsgenerator.cpp b/tests/auto/mvvmcore/settingsgenerator/tst_settingsgenerator.cpp new file mode 100644 index 0000000..7739a21 --- /dev/null +++ b/tests/auto/mvvmcore/settingsgenerator/tst_settingsgenerator.cpp @@ -0,0 +1,35 @@ +#include +#include +#include + +class SettingsGeneratorTest : public QObject +{ + Q_OBJECT + +public: + SettingsGeneratorTest(); + +private Q_SLOTS: + void testSettingsGeneration_data(); + void testSettingsGeneration(); +}; + +SettingsGeneratorTest::SettingsGeneratorTest() +{ +} + +void SettingsGeneratorTest::testSettingsGeneration_data() +{ + QTest::addColumn("data"); + QTest::newRow("0") << QString(); +} + +void SettingsGeneratorTest::testSettingsGeneration() +{ + QFETCH(QString, data); + QVERIFY2(true, "Failure"); +} + +QTEST_MAIN(SettingsGeneratorTest) + +#include "tst_settingsgenerator.moc" diff --git a/tools/settingsgenerator/qpmx.json b/tools/settingsgenerator/qpmx.json index 8de0c3d..972924c 100644 --- a/tools/settingsgenerator/qpmx.json +++ b/tools/settingsgenerator/qpmx.json @@ -3,7 +3,7 @@ { "package": "de.skycoder42.qxmlcodegen", "provider": "qpm", - "version": "1.1.0" + "version": "1.1.2" } ], "license": { diff --git a/tools/settingsgenerator/settingsgenerator.cpp b/tools/settingsgenerator/settingsgenerator.cpp index f1c418f..65bc96f 100644 --- a/tools/settingsgenerator/settingsgenerator.cpp +++ b/tools/settingsgenerator/settingsgenerator.cpp @@ -14,8 +14,10 @@ SettingsGenerator::SettingsGenerator(const QString &hdrPath, const QString &srcP void SettingsGenerator::process(const QString &inPath) { - // TODO add xml patterns... + // read settings and adjust defaults auto settings = readDocument(inPath); + if(!settings.name) + settings.name = QFileInfo{_hdrFile.fileName()}.baseName(); if(!_hdrFile.open(QIODevice::WriteOnly | QIODevice::Text)) throw FileException{_hdrFile}; @@ -231,7 +233,12 @@ void SettingsGenerator::writeHeader(const SettingsType &settings) << "#define " << incGuard << "\n\n"; // write the includes - for(const auto &inc : settings.includes) { + auto includes = QList { + {false, QStringLiteral("QtCore/QObject")}, + {false, QStringLiteral("QtMvvmCore/ISettingsAccessor")}, + {false, QStringLiteral("QtMvvmCore/SettingsEntry")} + } + settings.includes; + for(const auto &inc : includes) { if(inc.local) _hdr << "#include \"" << inc.includePath << "\"\n"; else @@ -240,21 +247,20 @@ void SettingsGenerator::writeHeader(const SettingsType &settings) _hdr << "\n"; // create the class - auto name = settings.name.value_or(QFileInfo{_hdrFile.fileName()}.baseName()); - _hdr << "class " << QString{settings.prefix ? settings.prefix.value() + QLatin1Char(' ') + name : name} << " : public QObject\n" + _hdr << "class " << QString{settings.prefix ? settings.prefix.value() + QLatin1Char(' ') + settings.name.value() : settings.name.value()} << " : public QObject\n" << "{\n" << "\tQ_OBJECT\n\n" - << "\tQ_PROPERTY(ISettingsAccessor *accessor READ accessor CONSTANT FINAL)\n\n" + << "\tQ_PROPERTY(QtMvvm::ISettingsAccessor *accessor READ accessor CONSTANT FINAL)\n\n" << "public:\n" - << "\tQ_INVOKABLE explicit " << name << "(QObject *parent = nullptr);\n" - << "\texplicit " << name << "(QObject *parent, ISettingsAccessor *accessor);\n\n" - << "\tstatic " << name << " *instance();\n\n" - << "\tISettingsAccessor *accessor() const;\n\n"; + << "\tQ_INVOKABLE explicit " << settings.name.value() << "(QObject *parent = nullptr);\n" + << "\texplicit " << settings.name.value() << "(QtMvvm::ISettingsAccessor *accessor, QObject *parent);\n\n" + << "\tstatic " << settings.name.value() << " *instance();\n\n" + << "\tQtMvvm::ISettingsAccessor *accessor() const;\n\n"; writeNodeElements(settings); _hdr << "\nprivate:\n" - << "\tISettingsAccessor *_accessor;\n" + << "\tQtMvvm::ISettingsAccessor *_accessor;\n" << "};\n\n" << "#endif //" << incGuard << '\n'; } @@ -287,5 +293,24 @@ void SettingsGenerator::writeEntry(const EntryType &entry, int intendent) void SettingsGenerator::writeSource(const SettingsType &settings) { + _src << "#include \"" << _hdrFile.fileName() << "\"\n\n"; + _src << settings.name.value() << "::" << settings.name.value() << "(QObject *parent) : \n" + << "\t" << settings.name.value() << "{nullptr, parent}\n" + << "{}\n\n"; + + _src << settings.name.value() << "::" << settings.name.value() << "(QtMvvm::ISettingsAccessor *accessor, QObject *parent) : \n" + << "\tQObject{parent},\n" + << "\t_accessor{accessor}\n" + << "{}\n\n"; + + _src << settings.name.value() << " *" << settings.name.value() << "::instance()\n" + << "{\n" + << "\treturn nullptr;\n" + << "}\n\n"; + + _src << "QtMvvm::ISettingsAccessor *" << settings.name.value() << "::accessor() const\n" + << "{\n" + << "\treturn _accessor;\n" + << "}\n\n"; }